package main

import (
	"encoding/json"
	"simulate_v2/lib/google"
)

type User struct {
	ID                  int64  `field:"id" json:"id"`                                     //  自增id
	UniqueId            string `field:"unique_id" json:"unique_id"`                       //  用户唯一标识(绑定设备id和主键id)
	Name                string `field:"name" json:"name"`                                 //  用户名称
	Avatar              string `field:"avatar" json:"avatar"`                             //  用户头像
	Email               string `field:"email" json:"email"`                               //  用户邮箱
	Coins               int64  `field:"coins" json:"coins"`                               //  用户购买的金币。用户可充值获得,剩余的金币
	Bonus               int64  `field:"bonus" json:"bonus"`                               //  用户购买金币时，赠送的。只能赠送。不能购买,剩余的赠送金币
	DeviceId            string `field:"device_id" json:"device_id"`                       //  设备id
	RegisterIp          int64  `field:"register_ip" json:"register_ip"`                   //  注册ip
	RegisterCountry     string `field:"register_country" json:"register_country"`         //  注册国家
	LastLogin           int64  `field:"last_login" json:"last_login"`                     //  最近一次登录
	CoinsConsume        int64  `field:"coins_consume" json:"coins_consume"`               //  账户消费金额(充值金币)
	BonusConsume        int64  `field:"bonus_consume" json:"bonus_consume"`               //  账户消费金额(赠送金币)
	PaypalEmail         string `field:"paypal_email" json:"paypal_email"`                 //  用户绑定的PayPal邮箱
	PaypalPhone         string `field:"paypal_phone" json:"paypal_phone"`                 //  用户绑定的PayPal手机号码
	VerificationCode    string `field:"verification_code" json:"verification_code"`       //  验证码(用户绑定邮箱要用到)
	VerificationExpired int64  `field:"verification_expired" json:"verification_expired"` //  验证码过期时间
	Status              int64  `field:"status" json:"status"`                             //  1:正常状态,2:禁用状态(禁用状态下不可登录)
	CreateAt            int64  `field:"create_at" json:"create_at"`
	UpdatedAt           int64  `field:"updated_at" json:"updated_at"`
	Deleted             int64  `field:"deleted" json:"deleted"` //  标识记录是否被删除（0：没有被删除，1：被删除）
}

func (u *User) String() string {

	b, _ := json.Marshal(u)
	return string(b)
}

type FilmDetail struct {
	Id                  int    `json:"id" field:"id"`
	Name                string `json:"name" field:"name"`
	CategoryName        string `json:"category_name" field:"-"`
	Weight              int    `json:"weight" field:"weight"`
	Image               string `json:"image" field:"image"`
	CooperationPlatform string `json:"cooperation_platform" field:"cooperation_platform"`
	Episodes            int    `json:"episodes"`
	Language            string `json:"language"`
	Keywords            string `json:"keywords"`
	Host                string `json:"host" field:"host"` //影片域名
	UpdatedAt           int    `json:"updated_at" field:"updated_at"`
	CreateAt            int    `json:"create_at" field:"create_at"`
}

type GetFilmDetailRsp struct {
	UnitPrice            int                 `json:"unit_price" field:"film.unit_price"` //单价(每集的价格)
	Episodes             int                 `json:"episodes" field:"film.episodes"`     //集数
	Id                   int64               `json:"id" field:"film.id"`
	Expired              int64               `json:"expired" field:"expired"` //购买影片后的有效观看期限
	Name                 string              `json:"name" field:"film.name"`
	Image                string              `json:"image" field:"image"`
	Description          string              `json:"description" field:"description"`
	Language             string              `json:"language" field:"language"` //语言
	Director             string              `json:"director" field:"director"`
	Author               string              `json:"author" field:"author"`
	MainActor            string              `json:"main_actor" field:"main_actor"`
	Keywords             interface{}         `json:"keywords" field:"keywords"`  //关键词(冗余字段,数据来自 film_keyword)
	Host                 string              `json:"host" field:"host"`          //影片域名
	Status               int64               `json:"status" field:"film.status"` //1:待上架,2:已上架,3:已下架
	FilmCategorys        []*FilmCategoryData `json:"film_categorys"`
	UnlockedFilmEpisodes []*FilmEpisodesRsp  `json:"unlocked_film_episodes"`
}

type FilmEpisodesRsp struct {
	Id        int64 `json:"id" field:"film_episodes.id"`
	EpisodeNo int   `json:"episode_no" field:"film_episodes.episode_no"`
	Expired   int64 `json:"expired" field:"unlock_order.expired"` //购买影片后的有效观看期限
}

type FilmEpisodes struct {
	EpisodeNo     int   `json:"episode_no" field:"film_episodes.episode_no"`
	Coins         int   `json:"coins" field:"film_episodes.coins"`
	ValidDuration int   `json:"valid_duration" field:"film_episodes.valid_duration"` // 有效时长,影片解锁之后，多长时间内有效(unix时间戳保存)
	Duration      int   `json:"duration" field:"film_episodes.duration"`             //持续时长（影片时长，单位毫秒）
	Id            int64 `json:"id" field:"film_episodes.id"`
	FilmId        int64 `json:"film_id" field:"film_episodes.film_id"`
	Status        int64 `field:"status" json:"film_episodes.status"` //1:正常状态,2:禁用状态(禁用状态下不可登录)
	CreateAt      int64 `json:"create_at" field:"film_episodes.create_at"`
	UpdatedAt     int64 `json:"updated_at" field:"film_episodes.updated_at"`
	Deleted       int64 `json:"deleted" field:"film_episodes.deleted"` //标识记录是否被删除（0：没有被删除，1：被删除）
	// Urls          json.RawMessage `json:"urls" field:"film_episodes.urls"`       //地址
}

type UserSpend struct {
	CoinsConsume int64 `field:"coins_consume" json:"coins_consume"` //  账户消费金额(充值金币)
	BonusConsume int64 `field:"bonus_consume" json:"bonus_consume"` //  账户消费金额(赠送金币)
}

// 接口返回结构体
type ApiRep[T map[string]interface{} | []map[string]interface{}] struct {
	Code   int    `json:"Code"`
	Data   T      `json:"Data"`
	ErrMsg string `json:"ErrMsg"`
}

// 管理端接口返回结构体
type AdaApiRep[T map[string]interface{} | []map[string]interface{}] struct {
	List  T   `json:"list"`
	Total int `json:"total"`
}

// paypal
type PayPalCreateOrderResponse struct {
	ID          string       `json:"id"`
	Links       []PayPalLink `json:"links"`
	PaymentLink string       `json:"paymentLink"`
}
type PayPalLink struct {
	Href   string `json:"href"`
	Rel    string `json:"rel"`
	Method string `json:"method"`
}

// 活动数据
type ActivityData struct {
	Id           int64 `json:"id" field:"id"`
	Price        int64 `json:"price" field:"price"`
	Coins        int64 `json:"coins" field:"coins"`
	Bonus        int64 `json:"bonus" field:"bonus"`
	BonusExpired int   `json:"bonus_expired" field:"bonus_expired"`
}

func (act *ActivityData) String() string {

	b, _ := json.Marshal(act)
	return string(b)
}

type UserActivityOrder struct {
	ActivityId int64  `json:"activity_id" field:"activity_id"`
	Price      int64  `json:"price" field:"price"`
	Coins      int64  `json:"coins" field:"coins"`
	Bonus      int64  `json:"bonus" field:"bonus"`
	OrderNo    string `json:"order_no" field:"order_no"`
	Finish     bool   `json:"finish" field:"finish"`
}

type UserActivityOrderTotal struct {
	Count int64 `json:"count" field:"count"`
	Price int64 `json:"price" field:"price"`
	Coins int64 `json:"coins" field:"coins"`
	Bonus int64 `json:"bonus" field:"bonus"`
}

func (uaot *UserActivityOrderTotal) Add(price int64, coins, bonus int64) *UserActivityOrderTotal {

	uaot.Bonus = uaot.Bonus + bonus
	uaot.Coins = uaot.Coins + coins
	uaot.Price = uaot.Price + price
	uaot.Count = uaot.Count + 1

	return uaot
}

func (uaot *UserActivityOrderTotal) String() string {

	b, _ := json.Marshal(uaot)
	return string(b)
}

type LoginRsp struct {
	*google.UserProfile `json:"google_user_profile,omitempty"`
	UserId              int    `json:"user_id"`
	DeviceId            string `json:"device_id"`
	OriginDeviceId      string `json:"origin_device_id"`
	Email               string `json:"email"`
	Token               string `json:"token"`
}

type userRecharge struct {
	Coins int64 `field:"coins" json:"coins"` //  用户购买的金币。用户可充值获得,剩余的金币
	Bonus int64 `field:"bonus" json:"bonus"` //  用户购买金币时，赠送的。只能赠送。不能购买,剩余的赠送金币
}

type FilmCategoryData struct {
	Id   int    `json:"id" field:"id"`
	Name string `json:"name" field:"name"`
}

type PaginationParam struct {
	PageIndex int `json:"page_index"`
	PageSize  int `json:"page_size"`
}

type UnlockEpisodeRsp struct {
	Price   int             `json:"price"`
	Balance Balance         `json:"balance,omitempty"` //用户金币余额
	Unlock  []*FilmEpisodes `json:"unlock"`            //成功解锁的章节
	Failed  []*FilmEpisodes `json:"failed"`            //失败的章节
	Msg     string          `json:"msg"`               //失败的原因
}

type Balance struct {
	Coins int64 `json:"coins"`
	Bonus int64 `json:"bonus"`
}

type UserUnlockOrderTotal struct {
	Count int64 `json:"count" field:"count"`
	Coins int64 `json:"coins" field:"coins"`
}

func (uaot *UserUnlockOrderTotal) Add(coins int64) *UserUnlockOrderTotal {

	uaot.Coins = uaot.Coins + coins
	uaot.Count = uaot.Count + 1

	return uaot
}

func (uaot *UserUnlockOrderTotal) String() string {

	b, _ := json.Marshal(uaot)
	return string(b)
}
